import axios from 'axios'
import {layer} from 'vue3-layer'
import Token from '@/api/token.js'
import router from '@/router'

// 设置 axios 请求的前缀
axios.defaults.baseURL = 'http://192.168.43.100:8000';
// 设置 axios 默认提交数据的方式
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

// 使用信号量、控制请求、并取消
const controller = new AbortController();
// 对请求进行拦截、如果请求需要loading，则设置loading为true
axios.interceptors.request.use(async function (config) {
    // 配置 信号量、可以当接口调用失败的时候、取消请求
    config.signal = controller.signal;
    if (config.loading) {
        config.loadIndex = layer.load(2)
    }
    // 如果接口 config 中传入了 permission = true, 或者 没有传入，均代表需要认证
    if (config.permission === undefined || config.permission) {
        // 获取 令牌
        try {
            const token = await Token.getAccessToken();
            if (token == null) {
                // 引导用户登录、取消请求
                controller.abort();
                router.push({name: "login"});
            }
            config.headers["Authorization"] = "Bearer " + token;
        } catch (e) {
            layer.msg('令牌获取失败', {icon: 2});
            // 令牌获取失败、取消请求
            controller.abort();
        }
    }
    return config;
}, function (error) {
    return Promise.reject(error);
});

// 对响应进行拦截、
axios.interceptors.response.use(function (response) {
    if (response.config.loading) {
        layer.close(response.config.loadIndex);
    }
    return response.data;

}, function (error) {

    if (error.response && error.response.config.loading) {
        layer.close(error.response.config.loadIndex)
    }

    // 如果状态码 401
    if (error.response && error.response.status === 401) {
        layer.msg('登录失效，请重新登录');
    } else if (error.response && error.response.status === 400) {
        layer.msg('请求参数有误');
    } else {
        layer.msg('接口调用失败');
    }
    return Promise.reject(error);
});

// 导出 axios
export default axios;
// 导出 controller , 用户可以随时自动取消请求
export {controller} ;